﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;

namespace Lamex.mSA.Common
{
    public class DataTableHelper
    {
        /// <summary>
        /// DataTable 去重，创建并返回一个新的 DataTable
        /// </summary>
        /// <param name="dt">原始DataTable</param>
        /// <param name="filedNames">去重字段</param>
        /// <returns></returns>
        public static DataTable Distinct(DataTable dt, string[] filedNames)
        {
            DataView dv = dt.DefaultView;
            DataTable DistTable = dv.ToTable("Dist", true, filedNames);
            return DistTable;
        }

       

        ///// <summary>
        ///// 比较两个DataTable数据（列名相同）
        ///// </summary>
        ///// <param name="dt1">DataTable1</param>
        ///// <param name="dt2">DataTable2</param>
        ///// <param name="keyField">关键字段名</param>
        ///// <param name="dtRetAdd">新增数据（dt2中的数据）</param>
        ///// <param name="dtRetDif1">不同的数据（dt1中的数据）</param>
        ///// <param name="dtRetDif2">不同的数据（dt2中的数据）</param>
        ///// <param name="dtRetDel">删除的数据（dt2中的数据）</param>
        //public static void CompareDt(DataTable dt1, DataTable dt2, string keyField,
        //    out DataTable dtRetAdd, out DataTable dtRetDif1, out DataTable dtRetDif2,
        //    out DataTable dtRetDel)
        //{
        //    //为三个表拷贝表结构
        //    dtRetDel = dt1.Clone();
        //    dtRetAdd = dtRetDel.Clone();
        //    dtRetDif1 = dtRetDel.Clone();
        //    dtRetDif2 = dtRetDel.Clone();

        //    int colCount = dt1.Columns.Count;

        //    DataView dv1 = dt1.DefaultView;
        //    DataView dv2 = dt2.DefaultView;

        //    //先以第一个表为参照，看第二个表是修改了还是删除了
        //    foreach (DataRowView dr1 in dv1)
        //    {
        //        dv2.RowFilter = keyField + " = '" + dr1[keyField].ToString() + "'";
        //        if (dv2.Count > 0)
        //        {
        //            if (!CompareUpdate(dr1, dv2[0]))//比较是否有不同的
        //            {
        //                dtRetDif1.Rows.Add(dr1.Row.ItemArray);//修改前
        //                dtRetDif2.Rows.Add(dv2[0].Row.ItemArray);//修改后                                                                   
        //                dtRetDel.Rows.Add(dr1.Row.ItemArray);//加上不同的dt1数据
        //                continue;
        //            }

        //        }
        //        else
        //        {
        //            //已经被删除的
        //            dtRetDel.Rows.Add(dr1.Row.ItemArray);
        //        }
        //    }

        //    //以第一个表为参照，看记录是否是新增的
        //    dv2.RowFilter = "";//清空条件
        //    foreach (DataRowView dr2 in dv2)
        //    {
        //        dv1.RowFilter = keyField + " = '" + dr2[keyField].ToString() + "'";
        //        if (dv1.Count == 0)
        //        {
        //            //新增的
        //            dtRetAdd.Rows.Add(dr2.Row.ItemArray);
        //        }
        //    }
        //}
        /// <summary>
        /// 比较两个DataTable数据（列名相同）
        /// </summary>
        /// <param name="dt1">DataTable1</param>
        /// <param name="dt2">DataTable2</param>
        /// <param name="keyField">关键字段名</param>
        /// <param name="dtRetDif2">返回需要更新的DataTable</param>
        /// <param name="dtRetDel">返回需要新增的DataTable</param>
        public static void CompareDt(DataTable dt1, DataTable dt2, string keyField,  out DataTable dtRetDif2, out DataTable dtRetDel)
        {
            //表拷贝表结构
            dtRetDel = dt1.Clone();
            dtRetDif2 = dtRetDel.Clone();

            int colCount = dt1.Columns.Count;

            DataView dv1 = dt1.DefaultView;
            DataView dv2 = dt2.DefaultView;

            //先以第一个表为参照，看第二个表是修改了还是删除了
            foreach (DataRowView dr1 in dv1)
            {
                dv2.RowFilter = keyField + " = '" + dr1[keyField].ToString() + "'";
                if (dv2.Count > 0)
                {
                    if (!CompareUpdate(dr1, dv2[0]))//比较是否有不同的
                    {
                        dtRetDif2.Rows.Add(dv2[0].Row.ItemArray);      
                        dtRetDel.Rows.Add(dr1.Row.ItemArray);//加上不同的dt1数据
                        continue;
                    }

                }
                else
                {
                    //已经被删除的
                    dtRetDel.Rows.Add(dr1.Row.ItemArray);
                }
            }
        }

        //比较是否有不同的
        private static bool CompareUpdate(DataRowView dr1, DataRowView dr2)
        {
            //行里只要有一项不一样，整个行就不一样,无需比较其它
            object val1;
            object val2;
            for (int i = 1; i < dr1.Row.ItemArray.Length-2; i++)//不用对比时间和创建人
            {
                val1 = dr1[i].ToString();
                val2 = dr2[i].ToString();
                if (!val1.Equals(val2))
                {
                    return false;
                }
            }
            return true;
        }

        //DataTable 转 List
        public static List<T> ToListByReflect<T>(DataTable dt) where T : new()
        {
            List<T> ts = new List<T>();
            string tempName = string.Empty;
            foreach (DataRow dr in dt.Rows)
            {
                T t = new T();
                PropertyInfo[] propertys = t.GetType().GetProperties();
                foreach (PropertyInfo pi in propertys)
                {
                    tempName = pi.Name;
                    if (dt.Columns.Contains(tempName))
                    {
                        object value = dr[tempName];
                        if (value != DBNull.Value)
                        {
                            pi.SetValue(t, value, null);
                        }
                    }
                }
                ts.Add(t);
            }
            return ts;
        }

    
        /// <summary>
        /// 两个table交集,返回table1
        /// </summary>
        /// <param name="table1"></param>
        /// <param name="table2"></param>
        /// <returns></returns>
        public static DataTable DataTableContrast(DataTable table1, DataTable table2,string table1_Name,string table2_Name)
        {
            DataTable dt = new DataTable();
            if (table1 != null && table2 != null)
            {
                var query = (from c in table1.Rows.Cast<DataRow>()

                             join d in table2.Rows.Cast<DataRow>() on c[table1_Name] equals d[table2_Name]

                             select c).ToList();
                if (query.Count > 0)
                {
                    dt = query.CopyToDataTable();
                }
            }
            return dt;

        }

        public static DataTable LinqToDataTableGroup(DataTable table)
        {
            DataTable dataTable = Common.GetTable.GetPRC_Table();
            var query = from t in table.AsEnumerable()
                        group t by new { t1 = t.Field<string>("TRANSPORT_NO"), 
                            t2 = t.Field<string>("ORDER_NO"),
                            t3 = t.Field<string>("CUSTOMER_NAME")                           
                        } into m
                        select new
                        {
                            出货单编号 = m.Key.t1,
                            装车日期 = "",
                            订单号码 = m.Key.t2,
                            体积 = m.Sum(n => n.Field<decimal?>("SHIPPING_VOLUME")),
                            重量 = m.Sum(n => n.Field<decimal?>("SHIPPING_WEIGHT")),
                            车型="",
                            车量_辆数="",
                            要求到RDC仓或到客日期= "",
                            客户名称=m.Key.t3,
                            目的地="",
                            分厂=""

                        };
            foreach (var item in query)
            {
                dataTable.Rows.Add(item.出货单编号, item.装车日期, item.订单号码, item.体积,
                    item.重量,item.车型,item.车量_辆数,item.要求到RDC仓或到客日期,
                    item.客户名称,item.目的地,item.分厂);
            }
            return dataTable;
        }

    }
}
